\documentclass[a4paper]{article}
\usepackage{graphicx}

\input{style/ch_xelatex.tex}
\input{style/scala.tex}

\lstset{frame=, basicstyle={\footnotesize\ttfamily}}



\graphicspath{ {images/} }
\usepackage{ctex}
%-----------------------------------------BEGIN DOC----------------------------------------

\begin{document}
\renewcommand{\contentsname}{目\ 录}
\renewcommand{\appendixname}{附录}
\renewcommand{\appendixpagename}{附录}
\renewcommand{\refname}{参考文献} 
\renewcommand{\figurename}{图}
\renewcommand{\tablename}{表}
\renewcommand{\today}{\number\year 年 \number\month 月 \number\day 日}

\title{{\Huge U10M11007试点班实验报告{\large\linebreak\\}}{\Large 三级流水线CPU设计报告\linebreak\linebreak}}
%please write your name, Student #, and Class # in Authors, student ID, and class # respectively
\author{\\姓\ 名:邵\ 怡\ 阳\\
学\ 号: 2018302404\\
班\ 号: 10011807\\\\
CS 11007 计算机组成与体系结构\\
(春季, 2020)\\\\
西北工业大学\\
计算机学院\\
ERCESI}
\date{\today}
\maketitle
\newpage

%-----------------------------------------ABSTRACT-------------------------------------
\begin{center}
{\Large\bf{摘\ 要\\}}
\end{center}
本报告是关于三级流水线设计的初步想法，包括全系统模块概览、关键模块详细说明，最后以一些指令为例画出其时序逻辑。
\newpage
%-----------------------------------------ABSTRACT-------------------------------------
\begin{center}
{\Large\bf{版\ 权\ 声\ 明\\}}
\end{center}
该文件受《中华人名共和国著作权法》的保护。ERCESI实验室保留拒绝授权违法复制该文件的权利。任何收存和保管本文件各种版本的单位和个人，未经ERCESI实验室（西北工业大学）同意，不得将本文档转借他人，亦不得随意复制、抄录、拍照或以任何方式传播。 否则，引起有碍著作权之问题，将可能承担法律责任。\newpage
%-----------------------------------------CONTENT-------------------------------------
\begin{center}
\tableofcontents\label{c}
\end{center}
\newpage

%------------------------------------------TEXT--------------------------------------------

%----------------------------------------OVERVIEW-----------------------------------------

\section{概述} \label{overview}%------------------------------
这一节主要描述由本人设计的三级处理器的基本结构及工作机理。

\begin{itemize}
	\item{\textbf{处理器基于指令集SMIPS}}
    \item{\textbf{三级流水线}}
    \item{\textbf{包含处理器数据通路、控制逻辑}}
\end{itemize}

%----------------------------------SYSTEM DESIGN------------------------------------------

\newpage
\section{系统设计} \label{sysdes}%------------------------------
\subsection{System Overview}\label{sub:sysover}
预计将本cpu的实现分为三级：
\begin{itemize}
	\item{\textbf{取址译码级：}按pc取出对应指令，译码器译码信号写入一二级寄存器和二三级寄存器，用pcALU将pc加4写回pc；}
	\item{\textbf{读寄存器运算级：}用对应的逻辑单元进行计算；}
	\item{\textbf{访存写回级：}关于存储器的读写，以及写回寄存器级。}
\end{itemize}
以下展示三级的高层次模块结构图，其中，蓝色为例外，深红色为bypass处理数据冒险，淡红色为stall处理数据冒险。
\begin{figure}[ht]
    \centering
    \includegraphics[height=10cm, width=13cm]{images/abstractcpu.pdf}
    \caption{三级流水线结构图}
    \label{fig:singleblock00}
\end{figure}
\\
\\
大致的时序逻辑如下：
\begin{figure}[ht]
    \centering
    \includegraphics[height=1.2cm, width=10cm]{images/piptime.pdf}
	\includegraphics[height=1.2cm, width=10cm]{images/piplinetime.pdf}
	\caption{三级流水时序逻辑}
	\label{fig:singleblock3}
\end{figure}

\subsection{接口定义}\label{sub:Interface}
本处理器借鉴以下表中顶层接口信号。
\begin{table}[htb]
\caption{顶层信号定义}\label{tab:signaldef0}
\begin{center}
	\begin{tabular}{|l|l|l|p{6cm}|}
	\hline
	\textbf{信号名} & \textbf{方向} & \textbf{位宽} & \textbf{功能描述}\\ \hline \hline
	\multicolumn{4}{|c|}{时钟、复位与中断}\\\hline
	clk		& Input 	& 1	& 时钟信号，来自clk\_pll的输出时钟\\ \hline
	resetn	& Input	& 1& 复位信号，低电平同步复位\\ \hline
	int 	& Input & 6 & 硬件中断，高电平有效\\ \hline
	\multicolumn{4}{|c|}{数据端访存接口}\\\hline
	inst\_sram\_en 	& Output & 1& ram使能信号，高电平有效\\ \hline
	inst\_sram\_wen	& Output & 4& ram字节写使能信号，高电平有效\\ \hline
	inst\_sram\_addr 	& Output& 32& ram读写地址，字节寻址\\ \hline
	inst\_sram\_wdata 	& Output& 32& ram写数据\\ \hline
	inst\_sram\_rdata	& Input & 32& ram读数据\\ \hline
	data\_sram\_en	& Output & 1& ram使能信号，高电平有效\\ \hline
	data\_sram\_wen & Output & 4& ram字节写使能信号，高电平有效 \\ \hline
	data\_sram\_addr 	& Output& 32&ram读写地址，字节寻址  \\ \hline
	data\_sram\_wdata	& Output& 32 & ram写数据\\ \hline
	data\_sram\_rdata &Input &32 & ram读数据\\ \hline
	\multicolumn{4}{|c|}{debug信号}\\\hline
	debug\_wb\_pc &Output &32 & 写回时当前指令的PC\\ \hline
	debug\_wb\_rf\_wen&Output &4 &写回时的寄存器使能信号 \\ \hline
	debug\_wb\_rf\_wnum &Output &5& 写回时的寄存器号\\ \hline
	debug\_wb\_ef\_wdata &Output & 32&写回寄存器的数据 \\ \hline
	\end{tabular}
\end{center}
\end{table}
\\
\subsection{接口的（时序）逻辑}\label{sub:logicinter}
这里分组画出正常流水下一些顶层信号的的时序逻辑图：
\begin{figure}[ht]
	\centering
	\includegraphics[height=1.3cm, width=8cm]{images/instmem.pdf}
	\caption{指令存储器信号}
	\label{fig:singleblock4}
\end{figure}
\\
\begin{figure}[ht]
	\centering
	\includegraphics[height=1.3cm, width=8cm]{images/datamem.pdf}
	\caption{数据存储器信号}
	\label{fig:singleblock5}
\end{figure}


% -----------------------------------BLOCKS DESIGN----------------------------------------
\newpage

\section{模块详细设计}
这一节，描述主要模块（图\ref{fig:singleblock00}中黄色部分）的功能、接口、逻辑控制方法等。
\subsection{ALU模块}\label{sub:alu}

\subsubsection{功能描述}
\begin{itemize}
	\item{\textbf{对算术逻辑指令}，用于进行对应计算，可抛出overflow例外}
	\item{\textbf{存取指令}，用于计算地址，可抛出地址错误例外}
    \item{\textbf{分支指令}，用于计算目标地址}
\end{itemize}

\subsubsection{接口定义}
方向见图\ref{fig:singleblock6}即可。
\begin{table}[ht]
	\caption{ALU模块信号定义}\label{tab:signaldef1}
	\begin{center}
		\begin{tabular}{|l|l|l|p{6cm}|}
		\hline
		\textbf{信号名} & \textbf{位宽} & \textbf{功能描述}\\ \hline \hline
		ALUop		& 4	&用于说明进行的运算种类。\\ \hline
		ALUsrcA & 1 & 选择运算数a\\ \hline
		hazardA & 2 & 确定运算数a是否需要旁路，以及需要哪一条\\ \hline
		ALUsrcB & 2 & 选择运算数b\\ \hline
		hazardB  & 2 & 确定运算数b是否需要旁路，以及需要哪一条\\ \hline
		of & 1 & 运算是否发生溢出 \\ \hline
		HI & 32 &乘法高位或除法余数 \\ \hline
		LO  & 32&乘法低位或除法商 \\ \hline
		ALUout & 32 & 运算结果 \\\hline
        SHout &32 & 旁路\\\hline
        PC & 32 & pc寄存器中存的当前地址\\\hline
        imm &16 & 立即数\\\hline
        BusA、BusB & 32 & 源寄存器的值\\\hline
        imm||00 & 18 & 立即数拼接两个零，用于分支指令计算目标地址\\\hline
        Extop &1 & 是否有符号扩展立即数\\\hline
 		\end{tabular}
	\end{center}
\end{table}

\newpage

\subsubsection{内部控制}
\begin{figure}[htb]
    \centering
    \includegraphics[height=6cm, width=7.8cm]{images/ALU_detail.pdf}
    \caption{ALU结构图}
    \label{fig:singleblock6}
\end{figure}
\newpage


\subsection{比较器模块}
\subsubsection{功能描述}
\begin{itemize}
	\item{判断是否发生数据冒险}
    \item{\textbf{分支指令中}，用于判断是否跳转}
\end{itemize}
\subsubsection{接口定义}

方向见图\ref{fig:singleblock7}即可
\begin{table}[htb]
	\caption{比较器模块信号定义}\label{tab:signaldef2}
	\begin{center}
		\begin{tabular}{|l|l|l|p{6cm}|}
		\hline
		\textbf{信号名} & \textbf{位宽} & \textbf{功能描述}\\ \hline \hline
		CAMop		& 4	&比较是否带符号\\ \hline
		CAMsrcB & 1 & 选择运算数B\\ \hline
		hazardA & 2 & 确定运算数a是否需要旁路，以及需要哪一条\\ \hline
		hazardB  & 2 & 确定运算数b是否需要旁路，以及需要哪一条\\ \hline
		ALUout & 32 & 旁路\\\hline
		SHout &32 & 旁路\\\hline
		BusB & 32 & 源寄存器的值 \\\hline
		BusA & 32 &源寄存器的值 \\ \hline
		Ra & 5 & 当前源寄存器地址\\ \hline
		Rb & 5 & 当前源寄存器地址\\ \hline
		Rw & 5 & 上一条写回寄存器 \\ \hline
		RAdh & 1 & Ra是否发生数据冒险\\\hline
		RBdh & 1 & Ra是否发生数据冒险\\ \hline
		caml、camq、camg & 1 & cam比较结果\\\hline
 		\end{tabular}
	\end{center}
\end{table}

\subsubsection{内部控制}
\begin{figure}[ht]
    \centering
    \includegraphics[height=10cm, width=12cm]{images/CAM_detail.pdf}
    \caption{CAM结构图}
    \label{fig:singleblock7}
\end{figure}

\newpage

\subsection{数据冒险处理模块}
\subsubsection{功能描述}
接收数据冒险，根据上一条指令的类型来处理，产生stall信号或者控制旁路。
\subsubsection{接口定义}

方向见图\ref{fig:singleblock8}即可
\begin{table}[htb]
	\caption{数据冒险处理模块信号定义}\label{tab:signaldef3}
	\begin{center}
		\begin{tabular}{|l|l|l|p{6cm}|}
		\hline
		\textbf{信号名} & \textbf{位宽} & \textbf{功能描述}\\ \hline \hline
		RAdh & 1 & Ra是否发生数据冒险\\\hline
		RBdh & 1 & Ra是否发生数据冒险\\ \hline
		W\_src[...]& 3 & 根据写回类型判断\\ \hline
		hazardA & 2 & 确定运算数a是否需要旁路，以及需要哪一条\\ \hline
		hazardB  & 2 & 确定运算数b是否需要旁路，以及需要哪一条\\ \hline
		stall &1 &由旁路解决不了的数据冒险需要停一拍 \\\hline
 		\end{tabular}
	\end{center}
\end{table}

\newpage

\subsubsection{内部控制}
\begin{figure}[ht]
    \centering
    \includegraphics[height=10cm, width=12cm]{images/datahazard_detail.pdf}
    \caption{dataHazard结构图}
    \label{fig:singleblock8}
\end{figure}

\subsection{移位器模块}

\subsubsection{功能描述}

支持逻辑左移位、逻辑右移、算术右移运算。

\subsubsection{接口定义}

方向见图\ref{fig:singleblock9}即可
\begin{table}[htb]
	\caption{移位器模块信号定义}\label{tab:signaldef4}
	\begin{center}
		\begin{tabular}{|l|l|l|p{6cm}|}
		\hline
		\textbf{信号名} & \textbf{位宽} & \textbf{功能描述}\\ \hline \hline
		BusB & 32 & 源寄存器的值 \\\hline
		BusA & 32 &源寄存器的值 \\ \hline
		SHop & 2 & 选择移位方式\\\hline
		SHsrc & 1 & 移位位数选择\\\hline
		sa & 5 & 移位数\\ \hline
		hazardA & 2 & 确定运算数a是否需要旁路，以及需要哪一条\\ \hline
		hazardB  & 2 & 确定运算数b是否需要旁路，以及需要哪一条\\ \hline
		ALUout & 32 & 旁路 \\\hline
		SHout & 32 & 运算结果 \\\hline
 		\end{tabular}
	\end{center}
\end{table}

\subsubsection{内部结构}
\begin{figure}[ht]
    \centering
    \includegraphics[height=8cm, width=9.6cm]{images/SHIFT_detail.pdf}
    \caption{SHIFT结构图}
    \label{fig:singleblock9}
\end{figure}

\newpage

\subsection{pc生成模块}

\subsubsection{功能描述}

生成下一指令地址。

\subsubsection{接口定义}

方向见图\ref{fig:singleblock10}即可
\begin{table}[htb]
	\caption{pc生成模块信号定义}\label{tab:signaldef5}
	\begin{center}
		\begin{tabular}{|l|l|l|p{6cm}|}
		\hline
		\textbf{信号名} & \textbf{位宽} & \textbf{功能描述}\\ \hline \hline
		pc & 32 & 当前pc值 \\\hline
		ALUout & 32 & 跳转目标地址 \\ \hline
		PC[31...28]||imm||00 & 32 & J型指令跳转地址\\\hline
		EPC & 32 & eret指令跳转地址\\\hline
		BusA & 32 & jr、jalr跳转地址\\ \hline
		caml、camq、camg & 1 & 比较器输出\\ \hline
		Zsrc  & 2 & 判断是否分支\\ \hline
		NZ & 1 & 是否需将比较器输出取反 \\\hline
		IsBr & 1 & 是否是分支指令 \\\hline
		pc\_sel & 2 & 正常情况下，选择下一地址\\\hline
		stall & 1 & 出现旁路解决不了的数据冒险\\ \hline
		catch & 1 & 出现例外,需跳转到执行\\\hline
		pcALUop & 1& pc加4还是加8\\\hline
		pip2pc & 32 & 例外或旁路时需$8000\ 0180_{16} $要暂停\\\hline 
		nPC & 32 & 产生的下一条指令\\\hline
  		\end{tabular}
	\end{center}
\end{table}

\subsubsection{内部结构}
\begin{figure}[ht]
    \centering
    \includegraphics[height=8cm, width=9.6cm]{images/pc_detail.pdf}
    \caption{pc生成结构图}
    \label{fig:singleblock10}
\end{figure}

\newpage

\subsection{EXP处理模块}
\subsubsection{功能描述}
接收例外信号并产生归零信号。
\subsubsection{接口定义}
方向见图\ref{fig:singleblock11}即可
\begin{table}[htb]
	\caption{EXP处理模块模块信号定义}\label{tab:signaldef6}
	\begin{center}
		\begin{tabular}{|l|l|l|p{6cm}|}
		\hline
		\textbf{信号名} & \textbf{位宽} & \textbf{功能描述}\\ \hline \hline
		of & 1 & 算术溢出例外\\\hline
		addrEXP & 1 & 地址错误例外\\ \hline
		break& 1 & break指令产生例外\\ \hline
		syscall & 1 & syscall产生例外\\ \hline
		catch & 1 & 是否有例外\\ \hline
 		\end{tabular}
	\end{center}
\end{table}
\newpage
\subsubsection{内部结构}
\begin{figure}[ht]
    \centering
    \includegraphics[height=8cm, width=9.6cm]{images/EXPdetail.pdf}
    \caption{EXP处理结构图}
    \label{fig:singleblock11}
\end{figure}


\subsection{signal12}
第一级流水线寄存器，由若干寄存器组成.
\newpage

\subsubsection{接口定义}
\begin{table}[htb]
	\caption{信号定义}\label{tab:signaldef7}
	\begin{center}
		\begin{tabular}{|l|l|l|p{6cm}|}
		\hline
		\textbf{信号名} & \textbf{位宽} & \textbf{功能描述}\\ \hline \hline
		stall、catch &1 & 该信号为1时，restn为1，将控制信号全部指为零\\\hline
		\multicolumn{3}{|c|}{来自译码器传向下一级流水线寄存器}\\\hline
		W\_src & 3 &  选择写回数据 \\\hline
		W\_en & 1 & 是否需要写回寄存器堆 \\\hline
		Rw & 5&  写回寄存器 \\\hline
		data\_sram\_en & 1 & DM访存使能信号\\ \hline
		data\_sram\_wen& 4 & DM访存写使能信号\\ \hline
		pc & 32& pc值\\\hline
		dmExt & 2 & 从数据取出的数是否需要扩展，需要零扩展或符号扩展\\\hline 
		\multicolumn{3}{|c|}{来自译码器用于控制第二级的各个模块}\\\hline
		ALUop& \multicolumn{2}{|c|}{见表\ref{tab:signaldef1}}\\
		ALUsrcA & \multicolumn{2}{|c|}{}\\
		ALUsrcB & \multicolumn{2}{|c|}{}\\
		THop & \multicolumn{2}{|c|}{} \\
		Extop & \multicolumn{2}{|c|}{} \\\hline
		CAMop & \multicolumn{2}{|c|}{见表\ref{tab:signaldef2}} \\
		CAMsrcB & \multicolumn{2}{|c|}{} \\\hline
		Ra &\multicolumn{2}{|c|}{见表\ref{tab:signaldef3}}\\
		Rb &  \multicolumn{2}{|c|}{}\\\hline
		SHsrc & \multicolumn{2}{|c|}{见表\ref{tab:signaldef4}}\\
		SHop& \multicolumn{2}{|c|}{}\\\hline
		break & \multicolumn{2}{|c|}{见表\ref{tab:signaldef6}} \\
		syscall & \multicolumn{2}{|c|}{} \\\hline
		pc\_sel &\multicolumn{2}{|c|}{见表\ref{tab:signaldef5}} \\
		NZ & \multicolumn{2}{|c|}{} \\
		Zsrc &\multicolumn{2}{|c|}{}  \\
		IsBr & \multicolumn{2}{|c|}{} \\
		pcALUop &\multicolumn{2}{|c|}{} \\\hline 
		HIsrc & 1 & 选择HI写入数据\\\hline
		LOsrc & 1 & 选择LO写入数据\\\hline
 		\end{tabular}
	\end{center}
\end{table}

\subsection{signal23}
第二级流水线寄存器，由若干寄存器组成.
\newpage

\subsubsection{接口定义}
\begin{table}[htb]
	\caption{信号定义}\label{tab:signaldef7}
	\begin{center}
		\begin{tabular}{|l|l|l|p{6cm}|}
		\hline
		\textbf{信号名} & \textbf{位宽} & \textbf{功能描述}\\ \hline \hline
		stall、catch &1 & 该信号为1时，restn为1，将控制信号全部指为零\\\hline 
		\multicolumn{3}{|c|}{来自上一级寄存器用于控制下一级的各模块}\\\hline
		W\_src & 3 &  选择写回数据 \\\hline
		W\_en & 1 & 是否需要写回寄存器堆 \\\hline
		Rw & 5&  写回寄存器 \\\hline
		data\_sram\_en & 1 & DM访存使能信号\\ \hline
		data\_sram\_wen& 4 & DM访存写使能信号\\ \hline
		pc & 32& pc值\\\hline
		dmExt & 2 & 从数据取出的数是否需要扩展，需要零扩展或符号扩展\\\hline 
		\multicolumn{3}{|c|}{来自第二级的各个模块，用于下一级各模块}\\\hline
		ALUout & 32 & 运算结果 \\ \hline
		SHout & 32 & 运算结果\\\hline
		31'b0||camq & 32 & 对于slt一类指令的写回数据\\\hline
		data\_sram\_wdata & 32& 注意来自由hazardB控制的多选器\\\hline
 		\end{tabular}
	\end{center}
\end{table}

\subsection{时序逻辑}
这里画出一些指令时序逻辑的时序图：

\subsubsection{例外异常处理}
\begin{scala}
	0: lw rt1, rs1, imm1
	1: break
	2: lw rt2, rs2, imm2
\end{scala} 

\begin{figure}[ht]
	%\centering
	\includegraphics[height=3cm, width=12cm]{images/EXPtime.pdf}
	\caption{EXP处理说明}
	\label{fig:singleblock}
\end{figure}

\subsubsection{bypass处理}
\begin{scala}
	0: add t0, t1, 1
	1: add t2, t0, 1
	2: sw t2, t3, 16
	3：add t4, t5, 1
\end{scala} 
\begin{figure}[ht]
	\centering
	\includegraphics[height=2cm, width=13cm]{images/of&datahd.pdf}
	\caption{bypass处理说明}
	\label{fig:singleblock}
\end{figure}

\subsubsection{stall处理}
\begin{scala}
	0: lw t0, t1, 16
	1: add t2, t0, 1
	2: add t3, t4, 1
\end{scala} 
\begin{figure}[ht]
	\centering
	\includegraphics[height=1.5cm, width=13cm]{images/stalltime.pdf}
	\caption{stall处理说明}
	\label{fig:singleblock}
\end{figure}

\subsubsection{分支跳转指令——beq}
\begin{scala}
	0: beq rt, rs, offset
	1: NP
\end{scala} 
\begin{figure}[ht]
	\centering
	\includegraphics[height=2cm, width=7cm]{images/beqtime.pdf}
	\caption{分支处理}
	\label{fig:singleblock}
\end{figure}

% -----------------------------------Appendix----------------------------------------

% -----------------------------------REFERENCE----------------------------------------




\end{document}

